home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGSCAL / TBUTIL1.LZH / TURBO-UT.DOC < prev    next >
Text File  |  1984-09-11  |  27KB  |  780 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.                               User-Supported Software
  17.  
  18.  
  19.                                    TURBO-UT.PAS
  20.  
  21.                                A Programmer's Utility
  22.  
  23.  
  24.                                         by
  25.                                  Donald R. Ramsey
  26.                                    Larry Romero
  27.  
  28.                                727 Bunker Hill #70
  29.                               Houston, Texas  77024
  30.  
  31.                                    Version 1.0
  32.  
  33.  
  34.  
  35.  
  36.  
  37.                                  Table of Contents
  38.  
  39.  
  40.           Introduction .....................................  1
  41.           System Requirements ..............................  1
  42.           Files Required on Disk ...........................  1
  43.  
  44.           Documentation Form ...............................  2
  45.  
  46.           Procedures
  47.              Msg ...........................................  2
  48.              Center ........................................  2
  49.              InvVideo ......................................  2
  50.              Color .........................................  2
  51.              Box ...........................................  2
  52.  
  53.              Option ........................................  3
  54.              StripSpaces ...................................  3
  55.              ClrWnd ........................................  3
  56.              SaveScreen ....................................  3
  57.              FlashScreen ...................................  3
  58.              Beep ..........................................  3
  59.              Say_Cap_Num ...................................  3
  60.  
  61.              Set_Cap_Num ...................................  4
  62.              Ck_Edit_Key ...................................  4
  63.              Get_Template ..................................  4
  64.  
  65.              Input .........................................  5
  66.  
  67.              Prompt ........................................  6
  68.              Say_Prompt ....................................  6
  69.              Get_Default ...................................  6
  70.              Do_Validation .................................  6
  71.  
  72.              Input_Handler .................................  7
  73.  
  74.              Hmenu .........................................  9
  75.              MainMenu ......................................  9
  76.  
  77.           Functions
  78.              Fmt_Real ......................................  10
  79.              UpcaseStr .....................................  10
  80.              ConstStr ......................................  10
  81.  
  82.           User-Supported Concept ...........................  11
  83.  
  84.           Future Enhancements & Update Policy ..............  12
  85.  
  86.           Appendix
  87.  
  88.           Invoice Form
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.                                    TURBO-UT.PAS
  96.                               A Programmer's Utility
  97.  
  98.       INTRODUCTION:
  99.  
  100.            When I started to write programs using Turbo Pascal, I realized
  101.       the potential of this language. However, as I quickly decided, I
  102.       needed a set of utilities to handle the requirements of data input,
  103.       validation of data, full screen editing, and the other chores of
  104.       everyday use. This utility is designed to handle many of these
  105.       functions.
  106.  
  107.            As I am new to the Pascal language, the utilities may not be
  108.       written in the best form, but they do work. You may use these
  109.       procedures as a guide to develop your own routines or, of course,
  110.       they may be used as they are. Please let me know if the routines
  111.       work well for you or if they need to be changed.
  112.  
  113.            Probably the best way to learn to use the subroutines is to
  114.       to read the explanations given in this document, then study the
  115.       SHELL.DEM program provided on the disk.
  116.  
  117.         The Appendix provides a quick reference to all the procedures
  118.     and functions. It is a list of the routines with a description of
  119.     the calling parameters.
  120.  
  121.         I hope this program makes Your programming easier.
  122.         
  123.                                                   Don & Larry
  124.  
  125.  
  126.     SYSTEM REQUIREMENTS:
  127.  
  128.         IBM-PC or true compatible
  129.         64K RAM
  130.         1 Disk Drive
  131.         Turbo Pascal 2.0
  132.  
  133.     FILES REQUIRED ON DISK:
  134.  
  135.         Turbo-ut.dem
  136.         Turbo-ut.pas
  137.         Turbo-ut.doc
  138.         Ut-Mod00.inc
  139.         Ut-Mod01.inc
  140.         Ut-Mod02.inc
  141.         Ut-Mod03.inc
  142.         Ut-Mod04.inc
  143.         Tstsound.com
  144.  
  145.  
  146.                                                              Page 2
  147.  
  148.  
  149.     DOCUMENTATION FORM:
  150.  
  151.       The procedures will be given in the following form:
  152.  
  153.       Procedure name(Variable 1,    { type var: description of var }
  154.                       .                          .
  155.                       .                          .
  156.                      Variable n)    { type var: description of var }
  157.         Description of routine and calling method.
  158.         Discussion if necessary.
  159.         What is returned to the main program.
  160.  
  161.  
  162.     PROCEDURES:
  163.  
  164.     Msg( String       { str: string to be displayed  }
  165.          Col,Row)     { int: Column & row for display}
  166.        Description: Display a message at the specified column
  167.           and row of the video.
  168.  
  169.  
  170.  
  171.     Center( String,        { str: string to be displayed  }
  172.             Col,Row,       { int: Col & row to center on  }
  173.             Line length)   { int: length of line to center on }
  174.        Description: clear the line to center on from the col,row
  175.         to the line-length, then Center the string on this line.
  176.  
  177.  
  178.  
  179.     InvVideo( String )    { str: String to display in inverse video }
  180.        Description: display a string in inverse video and return
  181.         to the calling routine with the background set to black
  182.         and the text white.
  183.  
  184.  
  185.  
  186.     Color(BackGnd,     { int: the desired background color }
  187.           Txt )        { int: the color for the text       }
  188.        Description: color the video as desired.
  189.  
  190.  
  191.  
  192.     Box( X1,Y1,  { int: upper left col & row for frame }
  193.          X2,Y2,  { int: lower right col & row          }
  194.          divider){ int: the row position for a dividing line}
  195.        Description: draw a box that has an optional line as a
  196.         divider. If you do not wish to have the extra line 
  197.         divide the box, just set Z = Y1.
  198.  
  199.  
  200.                                                              Page 3
  201.  
  202.  
  203.     Option;
  204.        Description: allow the user to press a key and return
  205.         that character as an upper character to the calling
  206.         routine.
  207.        Returned : Ch ( upper case )
  208.  
  209.  
  210.  
  211.     StripSpaces( String,   { str: string to strip spaces from end }
  212.                  NewStr )  { str: variable to return }
  213.       Description: Strip spaces from the end of a string.
  214.       Returned   : NewStr is a variable parameter that is returned to
  215.                    to the calling routine.
  216.  
  217.  
  218.  
  219.     ClrWnd( X1,Y1,  { int: upper left of area to clear }
  220.             X2,Y2)  { int: lower right of area to clear }
  221.        Description: this is an alternate method to that of 
  222.         defining a window and doing a CLRSCR for that window.
  223.         The advantage of this method is that the original
  224.         window is left intact and operations can be performed
  225.         without keeping track of the original window. The
  226.         disadvantage is that it is a little slower than CLRSCR.
  227.  
  228.  
  229.  
  230.     SaveScreen
  231.       Description: save a video display in memory for a quick
  232.         flash back when necessary. 
  233.  
  234.  
  235.  
  236.     FlashScreen
  237.       Description: this routine will re-display the screen saved
  238.         by the SaveScreen procedure.
  239.  
  240.  
  241.  
  242.     Beep( Tone,    { int: the tone to sound (Ex: 350 ) }
  243.           Duration){ int: the time to delay (Ex: 500 ) }
  244.       Description: turns on a tone for the desired duration 
  245.         then terminates the sound. You may test the sounds
  246.         by running TSTSOUND.COM.
  247.  
  248.  
  249.  
  250.     Say_cap_num
  251.       Description: display on the 25th line of the screen
  252.         the current status of the CAP, NUM, Ins keys.
  253.  
  254.  
  255.                                                             Page 4
  256.  
  257.  
  258.     Set_cap_num( Caps,    { ch: set to 'C' for caps }
  259.                  Num,     { ch: set to 'N' for nums }
  260.                  Ins)     { ch: set to 'I' for insert }
  261.       Description: set the keypad as desired by the programmer.
  262.         Ex: Set_cap_num('C','N','I')
  263.               will set the cap lock, the num lock, and turn
  264.               insert on.
  265.         Ex: Set_cap_num(' ','N',' ')
  266.               will set only the num lock.
  267.  
  268.  
  269.  
  270.     Ck_edit_key( Ch )   { ch: variable returned }
  271.       Description: A routine to determine if an edit key (Home, End,
  272.         arrow key, etc.) or a function key was pressed.
  273.       Discussion : IBM returns a two byte string for any edit
  274.         or function key that is pressed. In order to test for this
  275.         2 byte string you must read the keyboard twice, testing
  276.         the second byte for the edit or function key value. So,
  277.         you must read the KBD for a character and if a key is
  278.         pressed, call the routine (the procedure does the second
  279.         READ(kbd,ch)). At present, only the edit keys and the
  280.         10 function keys are checked. However, you could easily
  281.         expand the procedure to check the shift states, etc.
  282.         Example call:
  283.           READ(kbd,ch);
  284.           if keypressed Ck_edit_key(Ch);
  285.  
  286.       Returned   : the procedure will modify the variable
  287.         Ch if one of the edit or function keys was pressed or
  288.         leave Ch as it was in the first READ(kbd,ch) if no edit or
  289.         function key was pressed. You should look at the routine
  290.         to determine what Ch will return if it has been modified
  291.         (I always have to look, but, I know the function keys
  292.          will return ^a for <F1>,...,^i for <F9>,^j for <F10>).
  293.  
  294.  
  295.  
  296.     Get_template( template_num  { int: the number of the template  }
  297.                   template )    { str: variable returned to caller }
  298.       Description: get the required template for use in the
  299.         Input procedure.
  300.  
  301.  
  302.  
  303.                                                             Page 5
  304.  
  305.  
  306.     Input( type,    { ch: 'A' for alphanumerics
  307.                           'N' for numbers
  308.                           'F' for formatted entries }
  309.            default, { str: the default string that will be displayed
  310.                            in the input field }
  311.            col,row, { int: the position for the input }
  312.            length,  { int: the field length for the input or
  313.                            the template number if a formatted entry }
  314.            uppercase { boo: true for uppercase letters
  315.                             false otherwise }
  316.            F1        { boo: variable returned true if the <F1> key
  317.                             was pressed for the entry }
  318.            F10 )     { boo: variable returned true if the <F10> key
  319.                             was pressed for the entry }
  320.       Description: This is the main procedure for getting input from
  321.         a user. The numeric keypad, the Ins key, and the CAP lock
  322.         keys are set as desired by the programmer and these keys
  323.         are constantly monitored to see if their status has been
  324.         changed by the user. The key status is displayed on the
  325.         25th line of the screen in inverse video. As presently 
  326.         configured, the status of these three keys can be changed
  327.         at any time by the user.
  328.             The routine allows the user to use the keyboard as he
  329.         would normally expect. The arrow keys function when the
  330.         NUM lock is not set, the Home and End keys respond to send
  331.         the cusor to the start or end of the input line, and the 
  332.         Ins key state will allow a letter to be inserted in the input
  333.         string if it is set to ON.
  334.       Returned   : the entry of the user is return to the calling
  335.         procedure in the global variable ANSWER.
  336.  
  337.  
  338.  
  339.                                                             Page 6
  340.  
  341.  
  342.     Prompt( string1,   { str: string to be displayed on line 22 }
  343.             string2 )  { str: string to be displayed on line 23 }
  344.       Description: clear line 22 and 23 of the video then display
  345.         string1 and string2 there.
  346.  
  347.  
  348.  
  349.     Say_prompt( prompt_num )  { int: the prompt to display }
  350.       Description: specify string1 and string2 to be dispalyed
  351.         in the Prompt procedure. This is used primarily by the
  352.         Input_handler.
  353.  
  354.  
  355.  
  356.     Get_default( Default_num,  { int: the default for an input }
  357.                  Default )     { str: the variable returned    }
  358.       Description: provide the defaults to display in the input field
  359.         for the Input_handler.
  360.  
  361.  
  362.     Do_validation( Valid_num,  { int: the number of the
  363.                                       validation routine }
  364.                    Valid )     { boo: variable returned false if
  365.                                       invalid entry }
  366.       Description: provide a routine to validate any entries that
  367.         were made from the Input_handler. If the entry is
  368.         invalid on return from this procedure, the Input_handler
  369.         will require the user to re-enter the data.
  370.       Returned   : the boolean variable VALID is returned.
  371.  
  372.  
  373.  
  374.                                                             Page 7
  375.  
  376.  
  377.     Input_handler( string, { str: 5 character string (Ex: 'N0108')
  378.                                    1st ch:   N  for new entries
  379.                                              C  for changes
  380.                                              D  for re-display
  381.                                    nums 1-2: first element number of
  382.                                              P[] array to use
  383.                                    nums 3-4: last element of the
  384.                                              P[] array to use }
  385.                    Escape ) { boo: variable returned true if <F1> was
  386.                                    pressed at the first entry }
  387.       Description: this handler provides for full screen editing of
  388.         user inputs, provides a means for changing entries, and
  389.         redisplays a record.
  390.       Discussion : the programmer must provide the P[] array,
  391.         specifying each input that is required. The form for
  392.         P[] is
  393.             P[1] := '2505A02501T010102'
  394.               .
  395.               .
  396.             P[n]  where n is limited to 35 (35 entries per page)
  397.         Each element of P[] is defined below:
  398.  
  399.             element No.   Description
  400.                1-2        the column for input
  401.                3-4        the row for input
  402.                5          type input- A  for alphanumerics
  403.                                       N  for numbers
  404.                                       F  for foramtted entries
  405.                                       $  for dollar entries
  406.                6-9        the length of the input field or
  407.                               the template number if a formatted
  408.                               entry.
  409.                10-11      array element of Filvar[] array.
  410.                               Filvar[] is the global variable
  411.                               that is returned to the calling
  412.                               routine.
  413.                12         set to T if you wish the Caps lock set
  414.                13-14      the default number ( see Get_default )
  415.                15-16      the prompt number ( see Say_prompt )
  416.                17-18      the validation No.( see Do_validation )
  417.  
  418.                                                             continued...
  419.  
  420.                      ( Example on next page )
  421.  
  422.                                                             Page 8
  423.  
  424.  
  425.             The programmer must also provide for defaults, prompts,
  426.         and validation. The placement of these procedures is provided
  427.         in the utility.
  428.  
  429.             Example: the following procedure will call the handler:
  430.  
  431.               procedure Get_inputs;
  432.                 procedure Get_variables;
  433.                  begin
  434.                    P[1] := '2505N00801F010201';
  435.                    P[2] := '2607A02502T020203';
  436.                  end;
  437.                begin
  438.                  Get_variables;
  439.                  Input_handler('N0102');
  440.                end;
  441.  
  442.             This example will provide input for two variables. On
  443.         return from the handler, FILVAR[1] will contain the input
  444.         from the parameters specified in P[1] and FILVAR[2] will
  445.         contain the input from P[2].
  446.             Changes can be made to Filvar[1..n] by calling the
  447.         handler in the change mode. For example, if there were 7
  448.         variables in the Filvar array, the call
  449.         Input_handler('C0207') would allow changes to Filvar[2] thru
  450.         Filvar[7] ( note that Filvar[1] was skipped by this call ).
  451.             The handler may also be called in the Display mode.
  452.         It will then display all variables execpt the numbers. The
  453.         numbers may be displayed formatted using the FMT_REAL function.
  454.       Returned   : global variables Filvar[1..n]  ( max n = 35 )
  455.                    variable ESCAPE will return true if
  456.                      <F1> was pressed at the 1st field of input.
  457.  
  458.  
  459.                                                             Page 9
  460.  
  461.     Hmenu( Col,row,   { int: the column & row for the menu }
  462.            title,     { str: title for the menu, displayed one
  463.                              line above the col,row position }
  464.            Ch )       { Ch : variable returned to the calling
  465.                           calling routine. This was the
  466.                           choice the user pressed       }
  467.       Description: provide a lotus type menu. The programmer provides
  468.         the menu choices and prompts in the P[] array.
  469.         The following form will call the procedure:
  470.  
  471.           procedure Lotus_Menu;
  472.            var Exit: boolean;
  473.            begin
  474.             Exit := false;
  475.             Title := 'File Maintenance';
  476.             P[1]  := 'Add   .Add an account to the file';
  477.             P[2]  := 'List  .List a file';
  478.             P[3]  := 'Menu  .Return to the Main Menu';
  479.             P[4]  := ' ';
  480.             REPEAT 
  481.               Hmenu(1,2,title);
  482.               Case Ch of
  483.                 A : begin end;
  484.                 L : begin end;
  485.                 M : Exit := true;
  486.               end; { case }
  487.             UNTIL Exit = true;
  488.            end;
  489.         Note that all menu items must begin with a different letter
  490.         and each item is followed by a period.
  491.       Returned: The global variable Ch will be returned as the choice
  492.         selected by the user.
  493.  
  494.  
  495.  
  496.     MainMenu
  497.       Description: provide a skeleton for a main menu. The procedure
  498.         will draw a box around the menu items and verify the choice
  499.         of the user. All that is required of the programmer, is the
  500.         menu selections and a list of OKchoices ( Okchoices is a list
  501.         of all the choices that may be selected by the user )
  502.  
  503.  
  504.                                                             Page 10
  505.  
  506.  
  507.     FUNCTIONS
  508.  
  509.     Fmt_Real(number,    { real: number to format }
  510.              lenght,    { int:  the total length of the digits, commas,
  511.                                 and the decimals }
  512.              decimals)  { int:  the number of decimal places }
  513.       Description: a function to format a real number with a commas
  514.         and the decimals as desired.
  515.         Example: Fmt_Real( 1010.258,7,2) would return 1,010.26
  516.  
  517.  
  518.     UpcaseStr(S)   { str: string to convert to upper case }
  519.        Description: to convert any string to upper case characters.
  520.         This function may be useful when using the Turbo Toolbox for
  521.         converting an index string to all upper case letters.
  522.  
  523.  
  524.      ConstStr( Character,   { the cahracter to fill the string with }
  525.                Number)      { the number of characters in the string }
  526.       Description: fill a string with the character of the programmers
  527.         choice. This would be useful for drawing a line of characters on
  528.         the screen.
  529.         Example: gotoXY(1,4); write(ConstStr('=',80));
  530.           This example would draw a line of equal signs at line 4 of
  531.           the video.
  532.  
  533.  
  534.  
  535.  
  536.  
  537.                                                             Page 11
  538.  
  539.  
  540.     
  541.     =================== User-Supported Software ===================
  542.  
  543.     
  544.         If you have received this program from another
  545.          user and find it of value, your contribution
  546.            will be appreciated ( $25.00 suggested ).
  547.  
  548.  
  549.                       ______________________
  550.  
  551.                          Donald R. Ramsey
  552.                         727 Bunker Hill #70
  553.                        Houston, Texas  77024
  554.     
  555.                       _______________________
  556.  
  557.  
  558.         Regardless of whether you make a contribution, you are
  559.     encouraged to copy and distribute this program.
  560.  
  561.     ===============================================================
  562.  
  563.  
  564.  
  565.  
  566.     The user-supported concept:
  567.  
  568.         Anyone may request a copy of a user-supported program by
  569.     sending a blank, formatted disk to the program author together
  570.     with an addressed, postage-paid return mailer. A copy of the
  571.     program, with documentation, will be sent by return mail on
  572.     user's disk.
  573.  
  574.         The program carries a notice suggesting a contribution for
  575.     the software. Making a contribution is voluntary on the part of
  576.     the user.
  577.  
  578.     Regardless of whether a contribution is made, the user is
  579.     is encouraged to copy the program for trial use by others
  580.     on a private, non-commercial basis. Payment for use is
  581.     discretionary on the part or each subsequent user.
  582.  
  583.  
  584.  
  585.                                                             Page 12
  586.  
  587.  
  588.  
  589.     FUTURE ENHANCEMENTS AND UPDATE POLICY:
  590.  
  591.         This program is distributed under the user-supported
  592.     concept and, as such, will only be improved if you, the user,
  593.     make suggestions as to improvements and enhancements that you
  594.     would like to see. LET ME HEAR FROM YOU.
  595.  
  596.         Provided the Users do support this program, this will
  597.     apply. Any time there are revisions or up-dates to the program
  598.     I will notify all Registered Owners. They may then obtain a
  599.     copy of the new disk for a $10.00 fee. This fee is to cover the
  600.     cost of the disk as well as mailing. If you are not a Registered
  601.     owner then you will have to get the update from a friend.
  602.  
  603.         I might also mention that since I have spent a great
  604.     amount of time writing the program, I hope to benefit from
  605.     the contributions of the Users. If you do not contribute
  606.     to a Useful user-supported program, the supply of improving
  607.     public domain programs will start to diminish. Help make
  608.     this experiment a success and send a donation.
  609.  
  610.         If this program is useful to the users and is of benefit
  611.     to me, I will add other procedures and functions that will
  612.     extend the program and it's usefulness. If I don't hear from
  613.     you, I won't be encouraged to make any improvements or extensions.
  614.  
  615.  
  616.  
  617.  
  618.                                  APPENDIX
  619.  
  620.  
  621.    PROCEDURES:
  622.  
  623.     Msg( String       { str: string to be displayed  }
  624.          Col,Row)     { int: Column & row for display}
  625.  
  626.     Center( String,        { str: string to be displayed  }
  627.             Col,Row,       { int: Col & row to center on  }
  628.             Line length)   { int: length of line to center on }
  629.  
  630.     InvVideo( String )    { str: String to display in inverse video }
  631.  
  632.     Color(BackGnd,     { int: the desired background color }
  633.           Txt )        { int: the color for the text       }
  634.  
  635.     Box( X1,Y1,  { int: upper left col & row for frame }
  636.          X2,Y2,  { int: lower right col & row          }
  637.          divider){ int: the row position for a dividing line }
  638.  
  639.     Option;
  640.  
  641.     StripSpaces( String,   { str: string to strip spaces from end }
  642.                  NewStr )  { str: variable to return }
  643.  
  644.     ClrWnd( X1,Y1,  { int: upper left of area to clear }
  645.             X2,Y2)  { int: lower right of area to clear }
  646.  
  647.     SaveScreen;
  648.  
  649.     FlashScreen;
  650.  
  651.     Beep( Tone,    { int: the tone to sound (Ex: 350 ) }
  652.           Duration){ int: the time to delay (Ex: 500 ) }
  653.  
  654.     Say_Cap_num;
  655.  
  656.     Set_cap_num( Caps,    { ch: set to 'C' for caps }
  657.                  Num,     { ch: set to 'N' for nums }
  658.                  Ins)     { ch: set to 'I' for insert }
  659.  
  660.     Ck_edit_key( Ch )   { ch: variable returned }
  661.  
  662.     Get_template( template_num  { int: the number of the template  }
  663.                   template )    { str: variable returned to caller }
  664.  
  665.  
  666.  
  667.  
  668.     Input( type,      { ch: 'A' for alphanumerics
  669.                           'N' for numbers
  670.                           'F' for formatted entries }
  671.            default,   { str: the default string that will be displayed
  672.                            in the input field }
  673.            col,row,   { int: the position for the input }
  674.            length,    { int: the field length for the input or
  675.                            the template number if a formatted entry }
  676.            uppercase, { boo: true for uppercase letters
  677.                             false otherwise }
  678.            F1,        { boo: variable returned true if the <F1> key
  679.                              was pressed for the entry }
  680.            F10 )      { boo: variable returned true if the <F10> key
  681.                              was pressed for the entry }
  682.  
  683.     Prompt( string1,   { str: string to be displayed on line 22 }
  684.             string2 )  { str: string to be displayed on line 23 }
  685.  
  686.     Say_prompt( prompt_num )  { int: the prompt to display }
  687.  
  688.     Get_default( Default_num, { int: the default for an input }
  689.                  Default )    { str: variable returned        }
  690.  
  691.     Do_validation( Valid_num, { int: the number of the validation routine }
  692.                    Valid )    { boo: variable returned false if
  693.                                      invalid entry }
  694.  
  695.     Input_handler( string  { str: 5 character string (Ex: 'N0108')
  696.                                    1st ch:   N  for new entries
  697.                                              C  for changes
  698.                                              D  for re-display
  699.                                    nums 1-2: first element number of
  700.                                              P[] array to use
  701.                                    nums 3-4: last element of the
  702.                                              P[] array to use }
  703.                    Escape )  { boo: variable returned true if <F1> was
  704.                                     pressed at the first field }
  705.  
  706.     Hmenu( Col,row,   { int: the column & row for the menu }
  707.            title,     { str: title for the menu, displayed one
  708.                              line above the col,row position }
  709.         Ch )       { ch : variable character that is returned
  710.                           to calling routine. The user's choice }
  711.  
  712.     MainMenu;
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.    FUNCTIONS:
  720.  
  721.     Fmt_Real(number,    { real: number to format }
  722.              lenght,    { int:  the total length of the digits
  723.                                 and the decimals }
  724.  
  725.  
  726.     UpcaseStr(S)   { str: string to convert to upper case }
  727.  
  728.  
  729.     ConstStr( Character,   { the cahracter to fill the string with }
  730.               Number)      { the number of characters in the string }
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.                                INVOICE
  739.                              ===========
  740.  
  741.  
  742.  
  743.  
  744.     Purchased From:
  745.     
  746.        Donald R. Ramsey
  747.        727 Bunker Hill #70
  748.        Houston, Texas  77024
  749.  
  750.  
  751.     ==================================================================
  752.     Item       | Description                 | Qty | Price ea |  TOTAL
  753.     ==================================================================
  754.  
  755.     TURBO-UT.  | A programmer's utility      |     |          |
  756.             PAS|   for the IBM-PC            |     |  $25.00  |
  757.                |                             |     |          |
  758.                |                             |     |          |
  759.                |                             |     |          |    
  760.                |                             |     |          |
  761.     COPIES     | Copies of above software to |     |  $15.00  |
  762.                |   to be used at other       |     |          |
  763.                |   locations.                |     |          |
  764.                |                             |     |          |
  765.                |                             |     |          |
  766.                |                             |     |          |
  767.                |                             |     |          |
  768.                |                             |     |          |
  769.                |                             |     |          |
  770.     ==================================================================
  771.                                                  
  772.                                    TOTAL DUE:
  773.  
  774.     ==================================================================
  775.  
  776.  
  777.  
  778.  
  779.  
  780.     Retain this copy for your records.